//do
module do_mod(
	clk,
	rst,

	do_en_i,
	c_do_i,
	s_do_i,

	do_alu_en_i,
	do_reg_addr_i,
	do_csr_addr_i,
	do_data_i,
	do_data1_i,
	do_mcause_i,
	do_mtval_i,
	do_where_i,
	do_how_i,

	do_alu_en_o,
	do_reg_addr_o,
	do_csr_addr_o,
	do_data_o,
	do_data1_o,
	do_mcause_o,
	do_mtval_o,
	do_where_o,
	do_how_o
);

input clk;
input rst;

input do_en_i;
input c_do_i;
input [2:0] s_do_i;

input do_alu_en_i;
input [4:0] do_reg_addr_i;
input [11:0] do_csr_addr_i;
input [1:0] do_where_i;
input [7:0] do_how_i;
input [31:0] do_data_i;
input [31:0] do_data1_i;
input [31:0] do_mcause_i;
input [31:0] do_mtval_i;



output reg do_alu_en_o;
output reg [4:0] do_reg_addr_o;
output reg [11:0] do_csr_addr_o;
output reg [1:0] do_where_o;
output reg [7:0] do_how_o; //剩余一半空间
output reg [31:0] do_data_o;
output reg [31:0] do_data1_o;
output reg [31:0] do_mcause_o;
output reg [31:0] do_mtval_o;

always @ (posedge clk or posedge rst) begin
	if(rst == 1'b1) begin
		do_alu_en_o <= 1'b0;
		do_reg_addr_o <= 5'h0;
		do_csr_addr_o <= 12'h0;
		do_data_o <= 32'h0;
		do_data1_o <= 32'h0;
		do_mcause_o <= 32'h0;
		do_mtval_o <= 32'h0;
		do_where_o <= 2'h0;
		do_how_o <= 8'h0;
	end else if (s_do_i[2] == 1'b1) begin
		do_alu_en_o <= do_alu_en_o;
		do_reg_addr_o <= do_reg_addr_o;
		do_csr_addr_o <= do_csr_addr_o;
		do_data_o <= do_data_o;
		do_data1_o <= do_data1_o;
		do_mcause_o <= do_mcause_o;
		do_mtval_o <= do_mtval_o;
		do_where_o <= do_where_o;
		do_how_o <= do_how_o;
	end else if(do_en_i == 1'b1) begin
		if (c_do_i == 1'b1) begin
			do_alu_en_o <= 1'b0;
			do_reg_addr_o <= 5'h0;
			do_csr_addr_o <= 12'h0;
			do_data_o <= 32'h0;
			do_data1_o <= 32'h0;
			do_mcause_o <= 32'h0;
			do_mtval_o <= 32'h0;
			do_where_o <= 2'h0;
			do_how_o <= 8'h0;
		end else begin
			do_alu_en_o <= do_alu_en_i;
			do_reg_addr_o <= do_reg_addr_i;
			do_csr_addr_o <= do_csr_addr_i;
			do_data_o <= do_data_i;
			do_data1_o <= do_data1_i;
			do_mcause_o <= do_mcause_i;
			do_mtval_o <= do_mtval_i;
			do_where_o <= do_where_i;
			do_how_o <= do_how_i;
		end
	end else begin
			do_alu_en_o <= 1'b0;
			do_reg_addr_o <= 5'h0;
			do_csr_addr_o <= 12'h0;
			do_data_o <= 32'h0;
			do_data1_o <= 32'h0;
			do_mcause_o <= 32'h0;
			do_mtval_o <= 32'h0;
			do_where_o <= 2'h0;
			do_how_o <= 8'h0;
	 end
end

endmodule
